package Json2RDF.Surface2RDF.FaceManager;

import Json2RDF.Json2Java.OntologyClasses.PolygonalPlane;
import org.apache.jena.rdf.model.Resource;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * {@code PlaneEdgeManager}类用于建立{@code PolygonalPlane}和{@code Edge}之间的关联
 */
public class PlaneEdgeManager {

  /**
   * 平面RDF实例与对应边RDF实例的散列表，以平面的实例为key，该平面具有的边实例列表作为value
   */
  private static final Map<Resource, List<Resource>> planeEdges = new HashMap<>();

  /**
   * 将{@code edge}添加到以{@code polygonalPlane}为key的value中
   *
   * @param plane 输入平面RDF实例
   * @param edge  输入边RDF实例
   */
  public static void addEdgeToPlane(Resource plane, Resource edge) {
    planeEdges.computeIfAbsent(plane, v -> new ArrayList<>()).add(edge);
  }

  /**
   * 遍历{@code planeResource}，读取每个{@code polygonalPlane}的{@code edgeList}信息，遍历其中存储的每个Id，
   * 在{@code edgeResource}中根据Id找到对应的RDF实例，通过{@link PlaneEdgeManager#addEdgeToPlane addEdgeToPlane}添加到散列表中
   *
   * @param planeResource 平面对象到RDF实例的索引表
   * @param edgeResource  边的Id到边的RDF实例的索引表
   * @return {@code Map<Resource, List<Resource>> planeEdges} 平面RDF实例与对应边的RDF实例列表的散列表
   */
  public static Map<Resource, List<Resource>> EdgesToPlanes(Map<PolygonalPlane, Resource> planeResource, Map<String, Resource> edgeResource) {
    planeResource.forEach((k, v) -> {
      k.getEdgeList().forEach(e -> {
        addEdgeToPlane(v, edgeResource.get(e));
      });
    });
    return planeEdges;
  }
}
